package _11_整理题目._8_多线程._创建线程;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 从线程池获取可用线程，并执行
 *
 * 使用线程池的好处：
 *      线程池可以有效的控制系统中的并发线程数，
 * 线程池使用原理：
 *      Java 5 新增了一个 Executors 工厂类，通过一些静态方法 创建线程池，
 *      将一个实现了 Runnable 或 Callable 接口的实例传给 线程池，
 *      线程池就会启动一个空闲线程执行它们的 run() 或 call() 方法，
 *      执行结束后不会死亡，会再次返回线程池中成为空闲线程等待下一对象
 */
public class _21_线程池_1_ {

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        // 创建一个 runnable 接口匿名类，并 提交运行
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 4; i++) {
                    try {
                        Thread.sleep(33);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " : " + i);
                }
            }
        };
        threadPool.submit(runnable);

        // 使用 lambda 表达式创建一个 runnable 接口匿名类，并 提交运行
        Runnable runnable1 = () -> {
            for (int i = 0; i < 4; i++) {
                try {
                    Thread.sleep(33);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " : " + i);
            }
        };
        threadPool.submit(runnable1);

        System.out.println("hello");

        threadPool.shutdown();
    }

}
